package com.itguigu.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 1.@RequestMapping注解的功能
 *  从注解名词上我们可以看到,@RequestMapping注解作用就是将请求和处理请求的控制器关联起来,
 *  建立映射关系。
 *
 *
 *  2.@RequestMapping注解的位置
 *      @RequestMapping标识一个类: 设置映射请求的请求路径的初始信息
 *      @RequestMapping表示一个方法: 设置映射请求请求路径的具体信息
 *
 *  3.@RequestMapping注解的value属性
 *      @RequestMapping注解的value属性通过请求的的请求地址匹配请求映射
 *      @RequestMapping注解的value属性是一个字符串类型的数组,表示该强映射能够匹配多个
 *          请求地址所对应的请求。
 *      @RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射。
 *
 *
 *  4.@RequestMapping注解的method属性
 *          不设置method,能匹配两种请求
 *          @RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射。
 *          @RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求。
 *
 *          若当前请求的请求地址满足请求映射的value属性, 但是请求方式不满足method属性, 则浏览器报错405:
 *          Request method 'POST' not supported
 *          注：
 *              1、对于处理指定请求方式的控制器方法，SpringMVC中提供了@RequestMapping的派生注解
 *                  处理get请求的映射-->@GetMapping
 *                  处理post请求的映射-->@PostMapping
 *                  处理put请求的映射-->@PutMapping
 *                  处理delete请求的映射-->@DeleteMapping
 *              2、常用的请求方式有get，post，put，delete
 *
 *  5.@RequestMapping注解的params属性(了解)
 *      @RequestMapping注解的params属性通过请求的请求参数匹配请求映射
 *      @RequestMapping注解的params属性是一个字符串类型的数组,可以通过四种表达式设置请求参数
 *      和请求映射的匹配关系
 *
 *      "param": 要求请求映射所匹配的请求必须携带param请求参数
 *      "!param": 要求请求映射所匹配的请求必须不能携带param请求参数
 *      "param=value": 要求请求映射所匹配的请求必须携带param请求参数且param=value
 *      "param!=value": 要求请求映射所匹配的请求必须携带param请求参数但是param!=value
 *
 *  6.@RequestMapping注解的headers属性(了解)
 *          @RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射
 *          @RequestMapping注解的headers属性是一个字符串类型的数组,可以通过四种表达式设置请求头信息
 *          和请求映射的匹配关系。
 *          "header": 要求请求映射所匹配的请求必须携带header请求头信息
 *          "!header": 要求请求映射所匹配的请求必须不能携带header请求头信息
 *          等等
 *          若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时
 *          页面显示404错误,即资源未找到。
 *
 *  7.SpringMVC支持ant风格的路径(模糊匹配)
 *          ?: 表示re任意的单个字符
 *          *: 表示任意的0个或多个字符
 *          **: 表示任意的一层或多层目录
 *
 *  8.SpringMVC支持路径中的占位符(重点)
 *      原始方式: /deleteUser?id=1
 *      rest方式: /deleteUser/1
 *
 *      SpringMVC路径中的占位符常用于restful风格中,当请求路径中将某些数据通过
 *      路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}
 *      表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参
 *
 */
@Controller
//2
@RequestMapping("/hello")
public class RequestMappingController {

    /**
     * 要保证在整个控制器里面@RequestMapping里面的地址路径是唯一的不重复的
     */
//    @RequestMapping("/")
//    public String target() {
//        return "index";
//    }

    //1
    @RequestMapping("/testRquestMapping")
    public String success01() {
        return "success";
    }


    //3
    @RequestMapping(value = {
            "/testRequestMappingValue01", "/testRequestMappingValue02"
    })
    public String success02() {
        return "success";
    }

    //4
    @RequestMapping(value = {
            "/testMethodGet", "/testMethodPost"
    }, method = {
            RequestMethod.POST, RequestMethod.GET
    })
    public String success04() {
        return "success";
    }


    @GetMapping("/testGetMapping")
    public String testGetMapping() {
        return "success";
    }

    @RequestMapping(value = "testPut", method = RequestMethod.PUT)
    public String testPut() {
        return "success";
    }

    //5
    @RequestMapping(
            value = {"/testParam"},
            method = RequestMethod.GET,
            params = {"username=admin"}
    )
    public String param() {
        return "success";
    }


    //6
    @RequestMapping(
            value = {"/testHeaders"},
            method = RequestMethod.GET,
            //如果请求头携带这个键值对,就能匹配
            headers = {"Host=localhost:8080"}
    )
    public String headers() {
        return "success";
    }

    //7
    @RequestMapping("/a?a/testAnt")
    public String testAnt() {
        return "success";
    }

    //8
    @RequestMapping("/testRest/{id}/{username}")
    public String testRest(@PathVariable("id") String id,
                           @PathVariable("username") String username) {
        System.out.println("id:" + id + ",username:" + username);
        return "success";
    }

}
